.. _цикл while:

Цикл while
===========
.. index::
    while
    if

Цикл while аналогичен оператору if и, по сути, работает как повторяющийся оператор if.
Точно так же, как if, while также принимает логическое выражение и вычисляет блок, когда логическое выражение истинно. Разница в том, что оператор
while вычисляет логическое выражение и выполняет выражения в блоке повторно, пока логическое выражение истинно, а не только один раз. Повторение
блока кода таким образом называется циклическим.
Вот синтаксис оператора while:

.. code-block:: d

    while (a_logical_expression)
    {
    // ... выражения, выполняемые при значении true
    }

Например, код, который представляет eat cookies, пока есть cookie, может быть
закодирован следующим образом:

.. code-block:: d

    import std.stdio;

    void main()
    {
        bool existsCookie = true;
        while (existsCookie)
        {
            writeln("Take cookie");
            writeln("Eat cookie");
        }
    }



Эта программа продолжала бы повторять цикл, потому что значение
existsCookie никогда не меняется с true.
while полезно, когда значение логического выражения изменяется во время
выполнения программы. Чтобы убедиться в этом, давайте напишем программу, которая принимает число
от пользователя до тех пор, пока это число равно нулю или больше. Помните, что начальное
значение переменных int равно 0:

.. code-block:: d

    import std.stdio;

    void main()
    {
        int number;
        while (number >= 0)
        {
            write("Please enter a number: ");
            readf(" %s", &number);
            writeln("Thank you for ", number);
        }
        writeln("Exited the loop");
    }


Программа благодарит за предоставленный номер и выходит из цикла только тогда, когда число меньше нуля.

Оператор continue
-----------------

.. index::
    continue

Оператор continue сразу запускает следующую итерацию цикла, вместо выполнения остальных выражений блока.
Давайте изменим приведенную выше программу, чтобы она была немного разборчивой: вместо благодарности за любые
число, давайте не будем принимать 13. Следующая программа не благодарит за 13, потому
что в этом случае оператор continue заставляет программу перейти к началу
цикла, чтобы снова вычислить логическое выражение:

.. code-block:: d

    import std.stdio;

    void main()
    {
        int number;
        while (number >= 0)
        {
            write("Please enter a number: ");
            readf(" %s", &number);
            if (number == 13)
            {
                writeln("Sorry, not accepting that one...");
                continue;
            }
            writeln("Thank you for ", number);
        }
        writeln("Exited the loop");
    }


Мы можем определить поведение этой программы следующим образом: принимать числа до тех пор, пока они
больше или равны 0, но пропускать 13. continue также работает с операторами do-while, for и foreach. Мы
рассмотрим эти функции в последующих главах.

Оператор break
--------------

.. index::
    break

Иногда становится очевидным, что больше нет необходимости оставаться в цикле while. break позволяет программе немедленно выйти из цикла. Следующая
программа завершает цикл, как только находит специальный номер:

.. code-block:: d

    import std.stdio;

    void main()
    {
        int number;
        while (number >= 0)
        {
            write("Please enter a number: ");
            readf(" %s", &number);
            if (number == 42)
            {
                writeln("FOUND IT!");
                break;
            }
            writeln("Thank you for ", number);
        }
        writeln("Exited the loop");
    }


Мы можем обобщить это поведение следующим образом: принимать числа до тех пор, пока они больше или
равны 0 или пока число не станет равным 42.
break также работает с операторами do-while, for, foreach и switch. Мы
рассмотрим эти функции в последующих главах.

Безусловный цикл
-----------------
.. index::
    Безусловный цикл
    break

Иногда логическому выражению намеренно присваивается значение константы true. Оператор
break является распространенным способом выхода из таких безусловных циклов. (Бесконечный
цикл - альтернативный, но не совсем точный термин, который означает безусловный цикл.)
Следующая программа печатает меню в безусловном цикле; единственный способ
выход из цикла - это оператор break:

.. code-block:: d

    import std.stdio;

    void main()
    {
        /* Unconditional loop, because the logical expression is always
    * true */
        while (true)
        {
            write("0:Exit, 1:Turkish, 2:English - Your choice? ");
            int choice;
            readf(" %s", &choice);
            if (choice == 0)
            {
                writeln("See you later...");
                break; // The only exit of this loop
            }
            else if (choice == 1)
            {
                writeln("Merhaba!");
            }
            else if (choice == 2)
            {
                writeln("Hello!");
            }
            else
            {
                writeln("Sorry, I don't know that language. :/");
            }
        }
    }


*Примечание: Исключения также могут завершать безусловный цикл. Мы увидим исключенияв следующей главе.*

Упражнения
----------


1. Следующая программа предназначена для работы в цикле до тех пор, пока входные данные равны 3,
но есть ошибка: она не запрашивает никаких входных данных:

.. code-block:: d

    import std.stdio;

    void main()
    {
        int number;
        while (number == 3)
        {
            write("Number? ");
            readf(" %s", &number);
        }
    }


Исправьте ошибку. Программа должна оставаться в цикле до тех пор, пока входные данные равны 3.

2. Заставьте компьютер помочь Анне и Биллу сыграть в игру. Сначала компьютер
должен получить от Анны число в диапазоне от 1 до 10. Программа
не должна принимать никаких других чисел; она должна запросить еще раз.
Как только программа получит действительный номер от Анны, она должна начать принимать
номера от Билла, пока он не угадает номер Анны правильно.
Примечание: Цифры, которые вводит Анна, очевидно, остаются на терминале и могут быть
видны Биллу. Давайте проигнорируем этот факт и напишем программу как упражнение оператора while.
Решения приведены на странице 698.
